package com.zhss.demo.register.server;

import java.util.concurrent.atomic.LongAdder;

/**
 * 心跳测量计数器
 *
 * @author zhonghuashishan
 */
public class HeartbeatCounter {

    /**
     * 单例实例
     */
    private static HeartbeatCounter instance =
            new HeartbeatCounter();

    /**
     * 最近一分钟的心跳次数
     */
//    private AtomicLong latestMinuteHeartbeatRate = new AtomicLong(0L);
    private LongAdder latestMinuteHeartbeatRate = new LongAdder();
    /**
     * 最近一分钟的时间戳
     */
    private long latestMinuteTimestamp = System.currentTimeMillis();

    /**
     * 获取单例实例
     *
     * @return
     */
    public static HeartbeatCounter getInstance() {
        return instance;
    }

    /**
     * 增加一次最近一分钟的心跳次数
     * 这里使用synchronized重量级的锁，多线程到这里就会串行执行，降低了执行的效率
     * <p>
     * 换成AtomicLong原子类之后，不加锁，无锁化，cas操作保证原子性，还可以多线程并发
     */
    public /*synchronized*/ void increment() {
        long currentTime = System.currentTimeMillis();

        if (currentTime - latestMinuteTimestamp > 60 * 1000) {
//            latestMinuteHeartbeatRate.set(0L);
            latestMinuteHeartbeatRate.reset();
            this.latestMinuteTimestamp = System.currentTimeMillis();
        }

        latestMinuteHeartbeatRate.increment();
    }

    /**
     * 获取最近一分钟的心跳次数
     */
    public /*synchronized*/ long get() {
        return latestMinuteHeartbeatRate.longValue();
    }

}
